问题
Java有一个数据类型由两部分组成,包含基本类型(primitive),如int、double和boolean,和引用类型(reference type),如String和List。 每个基本类型都有一个对应的引用类型,称为装箱基本类型(boxed primitive)。由于Java自动装箱和拆箱机制,会使得在实际开发中基本类型和装箱类型混用,那么它们之间有什么区别?
解决
基本类型和装箱类型主要有3个主要区别:
- 基本类型只有值,而装箱类型具有和它们值不同的统一性,即
new Integer(42)==new Integer(42)
,虽然这两个装箱类型都是表示数字42,但是同一性判断会返回false
; - 基本类型只具有具体功能值,如数值等,而装箱类型还具有非功能值
null
; - 基本类型通常要比装箱类型更节省空间和运行时间。
注意:如果基本类型和装箱类型混合使用,装箱类型会拆箱为基本类型,这时,如果装箱类型为
null
,就会容易报NullPointException
。- 基本类型只有值,而装箱类型具有和它们值不同的统一性,即
什么时候用装箱类型
- 在使用集合时,键、值都只能使用装箱类型;
- 使用参数化类型时,如ThreadLocal类时,只能使用装箱类型
结论
当可以选择的时候,基本类型要优先于装箱类型。基本类型更加方便简单,性能更好。如果没办法避免使用装箱类型时,注意类型间同一性的比较,以及NullPointException。